package compilationunit;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Generador_Codigo {

    public static void generarLexico(){
      //  JFlex.Main m = new JFlex.Main();
      // -d directorio -->directorio donde crea el fichero AnalizadorLexico.java
      // direcci�n del fichero .jflex
        String[] parametros = {"D:\\compilationunit\\src\\compilationunit\\Scanner.java"};
      //  m.main(parametros);
      Main.main(parametros);
    }

    public static void generarSintactico() throws Exception{
    // se crear� en el paquete compiladores.sintactico
    // la clase se llamar� AnalizadorSintactico
    // -dump_grammar imprime la gram�tica por pantalla
    // -dump_tables imprime las tablas de acci�n
    // -dump_states imprime la colecci�n can�nica
    // -dump imprime todo -->TODOS ESTOS PAR�METROS NO SON OBLIGATORIOS, SE PUEDEN QUITAR
    // el �nico par�metro obligatorio es el fichero .cup
        String[] parametros = {"D:\\compilationunit\\src\\compilationunit\\Parser.java"};
  /*      String[] parametros = {"-dump","-parser","AnalizadorSintactico","-progress",
        "C:\\Upm\\Cuarto\\Segundo Cuatrimestre\\Compiladores\\Compiladores\\Compiladores\\sintactico.cup"};
        */
       Main.main(parametros);
    }
    
    public static void copiarFichero(String fEntrada,String fSalida)throws IOException{
         
            File ficheroEntrada = new File(fEntrada);
            BufferedWriter escritor = null;
            if(!ficheroEntrada.exists())
              throw new IOException("El fichero " +ficheroEntrada.getAbsolutePath() +" no existe");
              
            File ficheroTemp  = new File(fSalida);
            ficheroTemp.delete();
            if(!ficheroTemp.createNewFile())
              throw new IOException("No se puede crear el fichero");
            
            try{
            BufferedReader bufferLector = new BufferedReader(new InputStreamReader(new FileInputStream(ficheroEntrada),"UTF8"));
            String lineaFichero;
            escritor = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(ficheroTemp),"UTF8"));
            lineaFichero = bufferLector.readLine();
        
            while (lineaFichero != null)
            {
               escritor.write(lineaFichero);
               escritor.newLine();
               lineaFichero = bufferLector.readLine();
            }
            escritor.flush();
            escritor.close();
            bufferLector.close();
            }catch(Exception e){
            escritor.flush();
            escritor.close();
               e.printStackTrace();
            throw new IOException("se pudo cerrar el fichero de escritura. Mensaje de error: "+e.getLocalizedMessage());
            }
    }
    public static void main(String[] args) {
        //System.out.println(Math.pow(2,16));
        //System.out.println(Math.pow(2,16));
//    if(Integer.parseInt("65536") >= Math.pow(2,16))
//        System.out.println("guay");
//        else
//        System.out.println("no guay");
// ESTAS LLAMADAS GENERAN EL ANALIZADOR L�XICO Y EL SINT�CTICO.
// LAS OPCIONES VIENEN ESPECIFICADAS EN LOS PROPIOS M�TODOS.
        generarLexico();
        try {generarSintactico();}catch(Exception e){System.out.println("error generando sint�ctico: "+e.getLocalizedMessage());
        System.out.println("m�s info : "+e.getStackTrace());}
        try{
        copiarFichero("C:\\Upm\\Cuarto\\Segundo Cuatrimestre\\Compiladores\\Compiladores\\Compiladores\\sym.java",
        "C:\\Upm\\Cuarto\\Segundo Cuatrimestre\\Compiladores\\Compiladores\\Compiladores\\src\\compiladores\\sintactico\\sym.java");
        copiarFichero("C:\\Upm\\Cuarto\\Segundo Cuatrimestre\\Compiladores\\Compiladores\\Compiladores\\AnalizadorSintactico.java",
        "C:\\Upm\\Cuarto\\Segundo Cuatrimestre\\Compiladores\\Compiladores\\Compiladores\\src\\compiladores\\sintactico\\AnalizadorSintactico.java");
        }catch (Exception e){
            System.err.println("error copiando ficheros " + e.getLocalizedMessage());
        }
    }
}
